Предыдущий раздел ОСНОВНЫЕ ОПЕРАТОРЫ АССЕМБЛЕРА Следующий раздел

1.2.5. Операторы сдвига

Такие операторы перемещают все биты первого операнда (байта или слова) влево или вправо на число, заданное вторым операндом. Вторым операндом может быть только 1 или регистр CL.

Для всех восьми операторов сдвига флаг переноса CF является как бы расширением сдвигаемого операнда: в CF загружается значение бита, выдвинутого за пределы операнда.

Операторы сдвига разделяются на логические и арифметические. Логический оператор сдвига рассматривает знаковый бит операнда как обычный бит, а арифметический оператор сдвига обрабатывает  бит знака особо.

1) shl - логический сдвиг влево. Этот оператор сдвигает число без знака (рис. 88). При каждом сдвиге в освободившийся нулевой бит заносится 0. Например, пусть (AL) = 10110100b, CF = 0, тогда:

shl    al, 1                     ;   01101000 àAL,   1 àCF  

 

Рис. 88. Логический сдвиг влево shl

 

Одним из применений оператора shl является умножение беззнаковых чисел на степень числа 2. Например, пусть (CL) = 2, тогда:

shl  ax, cl           ; Умножение числа без знака в AX на 4

По сравнению с обычным умножением время выполнения в 6-8 раз меньше.

2) salарифметический сдвиг влево. Этот оператор сдвигает число со знаком. Действие аналогично shl. При этом содержимое знакового бита не сохраняется, но оно переписывается в флажок OF. Например, пусть  (AL) = 10110100b, CF = 0, OF = 0, тогда:

              sal     al, 1            ;  01101000 à AL,    1 à CF,    1 à OF

3) shrлогический сдвиг вправо. Этот оператор сдвигает число без знака. При каждом сдвиге операнда в освободившийся старший бит (бит 7 для байта и бит 15 для слова) заносится 0 (рис. 89). Например, пусть (AL) = 10110100b, CF = 1, тогда:

             shr     al, 1           ;  01011010 àAL,     0 àCF

 

Рис. 89. Логический сдвиг вправо  shr

 

Одним из применений оператора shr является деление беззнаковых чисел на степень числа 2. Например, пусть (CL) = 2, тогда:

shr     ax, cl                    ;  Деление беззнакового числа в AX на 4

4) sarарифметический сдвиг вправо. Данный оператор сдвигает число со знаком. При сдвиге в старшие освобождающиеся биты дублируется знак операнда (рис. 90). Например, пусть (AL) = 10110100b, CF = 1, тогда:

sar     al, 1                     ;  11011010 àAL,   0 àCF

 

Рис. 90. Арифметический сдвиг вправо  sar

 

Одним из применений оператора sar является деление чисел со знаком на степень числа 2. Например, пусть (CL) = 3, тогда:

sar     ax, cl                    ;  Деление числа со знаком в AX на 8

5) rolциклический сдвиг влево. При выполнении данного оператора (как и любого другого циклического оператора) вышедший за пределы операнда бит входит в него с противоположного конца (рис. 91). Например, пусть (AL) = 10110100b, CF = 0, тогда:

rol     al,1                      ;  01101001 àAL,      1 àCF

 

Рис. 91. Циклический сдвиг влево  rol

 

6) rorциклический сдвиг вправо (рис. 92). Например, пусть  (AL) = 10110100b, CF = 1, тогда:

ror     al, 1                     ;  01011010 à AL,       0 à CF

 

Рис. 92. Циклический сдвиг вправо ror

 

7) rclциклический сдвиг влево через перенос (рис. 93). Например, пусть (AL) = 10110100b, CF = 1, тогда:

rcl     al, 1                          ;  01101001 àAL,      1 àCF 

 

Рис. 93. Циклический сдвиг влево через перенос  rcl

 

8) rcrциклический сдвиг вправо через перенос (рис. 94). Например, пусть (AL) = 10110100b, CF = 1, тогда:

 

rcr     al,1                               ;  11011010 àAL,   0 àCF

 

Рис. 94. Циклический сдвиг вправо через перенос  rcr

 


Предыдущий раздел В начало Следующий раздел